//=============================================================================
/**
 * @file	opd_scene3.c
 * @brief	オープニングデモシーン3	ライバル〜ロケット団
 * @author	Nozomu Saito
 * @date    2009.03.20
 */
//=============================================================================

#include "opening_demo_local.h"
#include "opd_scene3.h"

#include "system/wipe.h"
#include "system/arc_tool.h"
#include "system/clact_tool.h"		//for REND_OAMTrans
#include "op_demo.naix"

#include "opd_def.h"

#define ACT_ID_S3_RIVAL	(2)
#define ACT_ID_S3_MINA_ANN	(3)
#define S3_ACT_RIVAL_PALETTE_NUM	(1)
#define S3_ACT_MINA_ANN_PALETTE_NUM	(2)

#define DISP_DISTANCE	(512)

#define RIVAL_DEF_POS_X		(128)
#define RIVAL_DEF_POS_Y		(96+DISP_DISTANCE)
#define MINAKI_DEF_POS_X		(32)
#define MINAKI_DEF_POS_Y		(96+DISP_DISTANCE)
#define ANN_DEF_POS_X		(128)
#define ANN1_DEF_POS_Y		(32+DISP_DISTANCE)
#define ANN2_DEF_POS_Y		(32+128+DISP_DISTANCE)
#define ANN3_DEF_POS_Y		(32+64+DISP_DISTANCE)

//グラフィックデータ依存
#define ANM_NO_RIVAL	(0)
#define ANM_NO_MINAKI	(0)
#define ANM_NO_ANN1		(1)
#define ANM_NO_ANN2		(2)
#define ANM_NO_ANN3		(3)


//シーン3		ライバル〜ロケット団
#define SUB_MASK_FRAME			(GF_BGL_FRAME0_S)
#define SUB_RIVAL_FRAME			(GF_BGL_FRAME3_S)

#define SUB_SUIKUN_FRAME		(GF_BGL_FRAME0_S)
#define SUB_ENTEI_FRAME			(GF_BGL_FRAME1_S)
#define SUB_RAIKOU_FRAME		(GF_BGL_FRAME2_S)

#define SUB_R1_FRAME			(GF_BGL_FRAME1_S)
#define SUB_R2_FRAME			(GF_BGL_FRAME2_S)
#define SUB_RMARK_FRAME			(GF_BGL_FRAME3_S)

#define ROCKETS_CHR	(32*16)		//ロケット団幹部キャラ数

static void SetVramBank(void);

static void Scene3BgSet(OPD_WK_PTR wk);
static void Scene3GraLoad(GF_BGL_INI *bgl, SCENE3_WORK *scene);
static void Scene3_Init(OPD_WK_PTR wk, SCENE3_WORK *scene);
static void SetScene3Start(SCENE3_WORK *scene, GF_BGL_INI *bgl);
static BOOL Scene3_Main(OPD_WK_PTR wk, SCENE3_WORK *scene, const int inCounter);
static void Scene3_End(OPD_WK_PTR wk, SCENE3_WORK *scene);

static void InitAct(OPD_WK_PTR wk, SCENE3_WORK *scene);
static void EndAct(OPD_WK_PTR wk, SCENE3_WORK *scene);
static void SetActor( OPD_WK_PTR wk, SCENE3_WORK *scene );

static void Load3D(SCENE3_WORK *scene_wk);
static void Disp3D(SCENE3_WORK *scene_wk);
static void SetUp3D(void);
static void SetUpLight(const u8 inNo);

//リソースマネージャー登録数テーブル
static const u8 ResEntryNumTbl[RESOURCE_NUM] = {
	2,			//キャラリソース
	2,			//パレットリソース
	2,			//セルリソース
	2,			//セルアニメリソース
};

static const int ModelArcTbl[MAP_BLOCK_MAX] = {
	NARC_op_demo_op_wakaba_nsbmd,
	NARC_op_demo_op_kogane_nsbmd,
	NARC_op_demo_op_enju_nsbmd,
};

static const int AnmArcTbl[MAP_BLOCK_MAX][ANIME_TYPE_NUM] = {
	{NARC_op_demo_op_wakaba_nsbca, NARC_op_demo_op_wakaba_nsbta},
	{NARC_op_demo_op_kogane_nsbca, NARC_op_demo_op_kogane_nsbta},
	{NARC_op_demo_op_enju_nsbca, NARC_op_demo_op_enju_nsbta},
};

//カメラ設定
static const GF_CAMERA_PARAM CameraData = {
	0x19aec1,
	{
		-0x29fe,0,0
	},
	GF_CAMERA_PERSPECTIV,
	0x05c1,
	0	//dummy
};

//エッジマーキングテーブル
static const GXRgb gEdgeColor[8] = {
    GX_RGB(0, 0, 0),
    GX_RGB(4, 4, 4),
    GX_RGB(4, 4, 4),
    GX_RGB(4, 4, 4),
    GX_RGB(4, 4, 4),
    GX_RGB(4, 4, 4),
    GX_RGB(4, 4, 4),
    GX_RGB(4, 4, 4)
};

//ライトパラメータ
static const VecFx32 LightVec[3][4] = {
	{
		{-1922,-3548,-296},
		{0,0,0},
		{0,0,4096},
		{0,0,4096},
	},
	{
		{-1914,-3548,-296},
		{0,0,0},
		{0,0,4096},
		{0,0,4096},
	},
	{
		{-1914,-3548,-296},
		{0,0,0},
		{0,0,4096},
		{0,0,4096},
	},
};

static const GXRgb LightColor[3][4] = {
	{
		GX_RGB(22,22,20),
		GX_RGB(0,0,0),
		GX_RGB(0,4,9),
		GX_RGB(0,0,0),
	},
	{
		GX_RGB(11,11,16),
		GX_RGB(0,0,0),
		GX_RGB(18,10,0),
		GX_RGB(0,0,0),
	},
	{
		GX_RGB(19,16,12),
		GX_RGB(0,0,0),
		GX_RGB(16,6,0),
		GX_RGB(0,0,0),
	},
};

static const GXRgb Diff[3] = {
	GX_RGB(15,15,15),
	GX_RGB(14,14,16),
	GX_RGB(15,15,15),
};

static const GXRgb Amb[3] = {
	GX_RGB(9,11,11),
	GX_RGB(10,10,10),
	GX_RGB(11,12,12),
};

static const GXRgb Spec[3] = {
	GX_RGB(16,16,16),
	GX_RGB(14,14,16),
	GX_RGB(17,17,17),
};

static const GXRgb Emi[3] = {
	GX_RGB(14,14,14),
	GX_RGB(8,8,11),
	GX_RGB(8,8,7),
};

//シーケンス
enum{
	SEQ_MAIN_BG_WIPE_IN,
	SEQ_WAKABA,
	SEQ_WAKABA_END_WAIT,
	SEQ_KOGANE,
	SEQ_KOGANE_END_WAIT,
	SEQ_ENJU,
	SEQ_ENJU_END_WAIT,
	SEQ_SUB_BG_WIPE_IN,
	SEQ_SUB_BG_WIPE_IN_WAIT,
	SEQ_RIVAL_SCREEN,
	SEQ_VANISH_MASK,
	SEQ_RAIVAL_DISP,
	SEQ_SUIKUN_SLIDE_IN_WAIT,
	SEQ_ENTEI_SLIDE_IN_WAIT,
	SEQ_RAIKOU_SLIDE_IN_WAIT,
	SEQ_ENSUIRAI_DISP,
	SEQ_MINAKI_WND_WAIT,
	SEQ_MINAKI_SLIDE_IN,
	SEQ_ENTEI_SLIDE_OUT_WAIT,
	SEQ_RAIKOU_SLIDE_OUT,
	SEQ_RAIKOU_SLIDE_OUT_WAIT,
	SEQ_SUIKUN_SLIDE_OUT,
	SEQ_SUIKUN_SLIDE_OUT_WAIT,
	SEQ_ROCKET_SCROLL_WAIT,
};

//--------------------------------------------------------------------------------------------
/**
 * シーンメイン関数
 *
 * @param	wk			ワーク
 * @param	sc_wk		シーンワークポインタ
 *
 * @return	BOOL		TRUEで終了
 */
//--------------------------------------------------------------------------------------------
BOOL OPD_Scene3(OPD_WK_PTR wk, void *sc_wk)
{
	SCENE3_WORK *scene = (SCENE3_WORK *)sc_wk;
	u8 *seq = &(scene->Seq);

	if (OPD_GetSkipFlg(wk)){
		(*seq) = 2;		//スキップ実行
	}

	switch(*seq){
	case 0:		//初期化・グラフィックロード
		Scene3_Init(wk, scene);
		(*seq)++;
		break;
	case 1:			//メイン
		if ( Scene3_Main( wk, scene, OPD_GetFrmCounter(wk) ) ){
			(*seq)++;
		}
		break;
	case 2:			//終了
		Scene3_End(wk, scene);

		return TRUE;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * ＶＲＡＭ設定
 *
 * @param	none
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetVramBank(void)
{
	GF_BGL_DISPVRAM vramSetTable = {
		GX_VRAM_BG_128_B,				// メイン2DエンジンのBG
		GX_VRAM_BGEXTPLTT_NONE,			// メイン2DエンジンのBG拡張パレット
		GX_VRAM_SUB_BG_128_C,			// サブ2DエンジンのBG
		GX_VRAM_SUB_BGEXTPLTT_NONE,	// サブ2DエンジンのBG拡張パレット
		GX_VRAM_OBJ_80_EF,				// メイン2DエンジンのOBJ
		GX_VRAM_OBJEXTPLTT_NONE,		// メイン2DエンジンのOBJ拡張パレット
		GX_VRAM_SUB_OBJ_16_I,			// サブ2DエンジンのOBJ
		GX_VRAM_SUB_OBJEXTPLTT_NONE,	// サブ2DエンジンのOBJ拡張パレット
		GX_VRAM_TEX_0_A,				// テクスチャイメージスロット
		GX_VRAM_TEXPLTT_0_G				// テクスチャパレットスロット
	};
	GF_Disp_SetBank( &vramSetTable );
}

//--------------------------------------------------------------------------------------------
/**
 * ＶＢＬＡＮＫ関数
 *
 * @param	work			ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void VBlankFunc(void* work)
{

	OPD_WK_PTR wk = work;
	GF_BGL_VBlankFunc( OPD_GetBGL(wk) );

	// レンダラ共有OAMマネージャVram転送
	REND_OAMTrans();
}

//--------------------------------------------------------------------------------------------
/**
 * シーン初期化
 *
 * @param	wk			ワーク
 * @param	scene		シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene3_Init(OPD_WK_PTR wk, SCENE3_WORK *scene)
{
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);

	// 読み込み開始位置を初期化
	CharLoadStartAll();
	PlttLoadStartAll();

	//３Ｄ描画スイッチ(上画面がメイン)
	sys.disp3DSW = DISP_3D_TO_MAIN;
	GF_Disp_DispSelect();

///	SetVramBank();		//Vバンクセット

	Scene3BgSet(wk);
	OPD_ResetDispEff(wk);

	sys_VBlankFuncChange(VBlankFunc,(void*)wk);

	//グラフィックロード
	Scene3GraLoad(bgl, scene);

	//上下画面の距離をセット
	OPD_SetDispDistance( wk, 0, 0, 0, DISP_DISTANCE );

	//アクター
	InitAct(wk, scene);
	SetActor( wk, scene );

	scene->Data.g3Dman = GF_G3DMAN_Init(HEAPID_OP_DEMO,
			GF_G3DMAN_LNK, GF_G3DTEX_128K, GF_G3DMAN_LNK, GF_G3DPLT_64K, SetUp3D );

	Load3D(scene);

	SetScene3Start(scene, bgl);

	scene->InitOK = 1;	//init通過
}

//--------------------------------------------------------------------------------------------
/**
 * シーン開始前セットアップ
 *
 * @param	scene		シーンワーク
 * @param	bgl			BGL
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetScene3Start(SCENE3_WORK *scene, GF_BGL_INI *bgl)
{
	//アクター初期状態セット
	{
		//ライバル表示
		OPD_StartDispAct(scene->Rival, 1);
	}
	//ＢＧ初期状態セット
	{
		//炎雷ＢＧ非表示
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1|GX_PLANEMASK_BG2, VISIBLE_OFF );
		//メイン画面は3Ｄ面のみ
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG0, VISIBLE_ON );
	}

	GF_BGL_BackGroundColorSet( GF_BGL_FRAME0_M, 0x0000 );	//背景色初期化（メイン画面）
	GF_BGL_BackGroundColorSet( GF_BGL_FRAME0_S, 0x0000 );	//背景色初期化（サブ画面）

	//下画面真っ黒
	WIPE_SetBrightness( WIPE_DISP_SUB,WIPE_FADE_BLACK );
}

//--------------------------------------------------------------------------------------------
/**
 * シーン再生メイン
 *
 * @param	wk			ワーク
 * @param	scene		シーンワーク
 * @param	inCounter	カウンタ
 *
 * @return	BOOL 		TRUEで終了
 */
//--------------------------------------------------------------------------------------------
static BOOL Scene3_Main(OPD_WK_PTR wk, SCENE3_WORK *scene, const int inCounter)
{
	u8 count;
	DISP_EFF_WORK *dew;
	GF_BGL_INI *bgl = OPD_GetBGL(wk);
	dew = GetDispEffWorkAdr(wk);
	count = OPD_GetSceneCount(wk);

	Disp3D(scene);

	switch( OPD_GetSceneSeq(wk) ){
	case SEQ_MAIN_BG_WIPE_IN:
		//ライト適用
		SetUpLight(scene->Disp3DNo);
		OPD_WipeStart(	wk, WIPE_WHITE_IN, TRUE, S3_WAKABA_WIPE_IN_SYNC);
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case SEQ_WAKABA:
		if (count > S3_WAIT_WAKABA_DISP){
			OPD_WipeStart(	wk, WIPE_BLACK_OUT, TRUE, S3_WAKABA_WIPE_OUT_SYNC);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_WAKABA_END_WAIT:
		if ( OPD_CheckWipeEnd(wk) ){
			OPD_WipeStart(	wk, WIPE_BLACK_IN, TRUE, S3_KOGANE_WIPE_IN_SYNC);
			//次コガネ
			scene->Disp3DNo = 1;
			//ライト適用
			SetUpLight(scene->Disp3DNo);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_KOGANE:
		if (count > S3_WAIT_KOGANE_DISP){
			OPD_WipeStart(	wk, WIPE_BLACK_OUT, TRUE, S3_KOGANE_WIPE_OUT_SYNC);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_KOGANE_END_WAIT:
		if ( OPD_CheckWipeEnd(wk) ){
			OPD_WipeStart(	wk, WIPE_BLACK_IN, TRUE, S3_ENJU_WIPE_IN_SYNC);
			//次エンジュ
			scene->Disp3DNo = 2;
			//ライト適用
			SetUpLight(scene->Disp3DNo);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_ENJU:
		if (count > S3_WAIT_ENJU_DISP){
			OPD_WipeStart(	wk, WIPE_BLACK_OUT, TRUE, S3_ENJU_WIPE_OUT_SYNC);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_ENJU_END_WAIT:
		if ( OPD_CheckWipeEnd(wk) ){
			//3Ｄ表示終わり
			scene->Disp3DNo = 0xffff;
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_SUB_BG_WIPE_IN:
		OPD_WipeStart(	wk, WIPE_BLACK_IN, FALSE, S3_RIVAL_WIPE_IN_SYNC);
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case SEQ_SUB_BG_WIPE_IN_WAIT:
		if ( OPD_CheckWipeEnd(wk) ){
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_RIVAL_SCREEN:			//
		{
			int mask_count[3] = {S3_CONT_MASK_1,S3_CONT_MASK_2,S3_CONT_MASK_3};
			if (count >= mask_count[scene->MaskNo] ){
				u8 no;
				scene->MaskNo++;
				no = scene->MaskNo;
				//スクリーン転送
				GF_BGL_ScreenBufSet( bgl, SUB_MASK_FRAME, scene->ScrnData[no]->rawData, scene->ScrnData[no]->szByte );
				GF_BGL_LoadScreenV_Req(bgl, SUB_MASK_FRAME);
				if (scene->MaskNo >= 3 ){
					//ライバルシルエット消す
					OPD_StartDispAct(scene->Rival, 0);
					OPD_IncSceneSeq(wk);	//シーケンスシフト
				}
			}
		}
		break;
	case SEQ_VANISH_MASK:			//
		if (count >= S3_CONT_MASK_4){
			//マスク消す
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG0, VISIBLE_OFF );
			//マスクスクリーンをスイクンスクリーンに書き換え
			GF_BGL_ScreenBufSet( bgl, SUB_SUIKUN_FRAME,
					scene->SuikunScrnData->rawData, scene->SuikunScrnData->szByte );
			GF_BGL_LoadScreenV_Req(bgl, SUB_SUIKUN_FRAME);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_RAIVAL_DISP:	//ライバル表示中
		if (count == S3_WAIT_WIN_UD_START){
			WND_PARAM param = {
				0,0,255,192,
				0,S3_RIVAL_WIN_U,255,192-S3_RIVAL_WIN_U,
				GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
					GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_OBJ,
				1,1
			};

			OPD_ReqWindowMove(&dew->WndCnt, S3_RIVAL_WIN_MAKE_SYNC, FALSE, &param);
		}

		if (count >= S3_WAIT_SUIKUN_SLIDE_START){
			//ウィンドウ設定
			{
				WND_PARAM param = {
					0,S3_RIVAL_WIN_U,1,192-S3_RIVAL_WIN_U,
					0,S3_RIVAL_WIN_U,255,192-S3_RIVAL_WIN_U,
					GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
						GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
					GX_WND_PLANEMASK_OBJ,
					1,1
				};
				OPD_ReqWindowMove(&dew->WndCnt, S3_SUIKUN_SLIDE_IN_SYNC, FALSE, &param);
				GXS_SetVisibleWnd( GX_WNDMASK_W0 );		//ウィンドウ1は非表示(ウィンドウ0のみ使用)
			}

			//スイクンBGスライドイン
			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_SUIKUN_FRAME,
						-256, 0,	S3_SUIKUN_SLIDE_IN_SYNC );
			//スイクンスクリーンＢＧ表示
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG0, VISIBLE_ON );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_SUIKUN_SLIDE_IN_WAIT:
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, SUB_SUIKUN_FRAME) ){		//スイクンスライド待ち
			//ウィンドウ設定
			{
				WND_PARAM param = {
					254,0,255,192-S3_RIVAL_WIN_U,
					0,0,255,192-S3_RIVAL_WIN_U,
					GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
						GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
					GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_OBJ,
					1,1
				};
				OPD_ReqWindowMove(&dew->WndCnt, S3_ENTEI_SLIDE_IN_SYNC, FALSE, &param);
			}
			//エンテイスライドイン
			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_ENTEI_FRAME,
						256, 0,	S3_ENTEI_SLIDE_IN_SYNC );
			//エンテイスクリーンＢＧ表示
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_ON );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_ENTEI_SLIDE_IN_WAIT:
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, SUB_ENTEI_FRAME) ){	//エンテイスライド待ち
			//ウィンドウ設定
			{
				WND_PARAM param = {
					0,0,1,192,
					0,0,255,192,
					GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
						GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
					GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_OBJ,
					1,1
				};
				OPD_ReqWindowMove(&dew->WndCnt, S3_RAIKOU_SLIDE_IN_SYNC, FALSE, &param);
			}
			//ライコウスライドイン
			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_RAIKOU_FRAME,
						-256, 0, S3_RAIKOU_SLIDE_IN_SYNC );
			//ライコウスクリーンＢＧ表示
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_ON );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_RAIKOU_SLIDE_IN_WAIT:
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, SUB_RAIKOU_FRAME) ){	//ライコウスライド待ち
			//ウィンドウ効果オフ
			GX_SetVisibleWnd(GX_WNDMASK_NONE);
			GXS_SetVisibleWnd(GX_WNDMASK_NONE);
			//ロケット団キャラロード(炎水雷のキャラデータは残す)
			ArcUtil_BgCharSet(ARC_OP_DEMO, NARC_op_demo_demo_rdan_u_lz_ccgr,
						bgl, SUB_RMARK_FRAME, 0, ROCKETS_CHR*32, TRUE, HEAPID_OP_DEMO);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_ENSUIRAI_DISP:		//伝説三匹表示中
		//ウィンドウスクロールリクエスト
		if (count>=S3_WAIT_ENSUIRAI_DISP) {
			WND_PARAM param = {
				0,0,255,192,
				S3_ENSUIRAI_WIN_L,0,255-S3_ENSUIRAI_WIN_L,192,
				GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
					GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_OBJ,
				1,1
			};
			OPD_ReqWindowMove(&dew->WndCnt, S3_EBSUIRAI_WIN_MAKE_SYNC, FALSE, &param);
			GXS_SetVisibleWnd( GX_WNDMASK_W0 );		//ウィンドウ1は非表示(ウィンドウ0のみ使用)
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_MINAKI_WND_WAIT:		//縦ウィンドウマスク作成待ち
		if ( OPD_CheckWndEnd(&dew->WndCnt, FALSE) ){
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_MINAKI_SLIDE_IN:
		//ミナキ登場時間か？
		if(count == S3_CONT_MINAKI){
			//ミナキ登場
			OPD_StartDispAct(scene->Minaki, 1);
		}
		//アンノーン登場時間か？
		if(count == S3_CONT_ANN1){
			//アンノーン
			OPD_StartDispAct(scene->Ann[0], 1);
		}
		if (count >= S3_CONT_ENTEI_SLIDE_OUT){
			//エンテイはける
			WND_PARAM param = {
				S3_ENSUIRAI_WIN_L,0,255-S3_ENSUIRAI_WIN_L,192,
				255-S3_ENSUIRAI_WIN_L,0,255-S3_ENSUIRAI_WIN_L,192,
				GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
					GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_OBJ,
				1,1
			};
			OPD_ReqWindowMove(&dew->WndCnt, S3_ENTEI_SLIDE_OUT_SYNC, FALSE, &param);
			//ウィンドウ1に特殊設定
			G2S_SetWnd1Position( S3_ENSUIRAI_WIN_L, S3_RIVAL_WIN_U, 255-S3_ENSUIRAI_WIN_L, 192 );
			G2S_SetWnd1InsidePlane( GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG2|
					GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ, 1 );	//エンテイＢＧ抜き
			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_ENTEI_FRAME,
						-(256-(S3_ENSUIRAI_WIN_L*2)), 0,	S3_ENTEI_SLIDE_OUT_SYNC );

			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_ENTEI_SLIDE_OUT_WAIT:
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, SUB_ENTEI_FRAME) ){	//エンテイはけたか？
			//エンテイＢＧ消す
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
			//ウィンドウ設定
			{
				WND_PARAM param = {
					S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,255-S3_ENSUIRAI_WIN_L,192,
					S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,255-S3_ENSUIRAI_WIN_L,192,
					GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
						GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
					GX_WND_PLANEMASK_OBJ,
					1,1
				};
				OPD_ReqWindowMove(&dew->WndCnt, 0, FALSE, &param);	//即反映
			}
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_RAIKOU_SLIDE_OUT:
		if (count >= S3_CONT_ANN2){
			//アンノーン
			OPD_StartDispAct(scene->Ann[1], 1);
		}

		if (count >= S3_CONT_RAIKOU_SLIDE_OUT){
			//ライコウはける
			WND_PARAM param = {
				S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,255-S3_ENSUIRAI_WIN_L,192,
				255-S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,255-S3_ENSUIRAI_WIN_L,192,
				GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
					GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_OBJ,
				1,1
			};
			OPD_ReqWindowMove(&dew->WndCnt, S3_RAIKOU_SLIDE_OUT_SYNC, FALSE, &param);
			//ウィンドウ1に特殊設定
			G2S_SetWnd1Position( S3_ENSUIRAI_WIN_L, S3_RIVAL_WIN_U, 255-S3_ENSUIRAI_WIN_L, 192-S3_RIVAL_WIN_U );
			G2S_SetWnd1InsidePlane( GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG3|
					GX_WND_PLANEMASK_OBJ, 1 );	//炎雷ＢＧ抜き
			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_RAIKOU_FRAME,
						-(256-(S3_ENSUIRAI_WIN_L*2)), 0, S3_RAIKOU_SLIDE_OUT_SYNC );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
			break;
		}
		break;
	case SEQ_RAIKOU_SLIDE_OUT_WAIT:
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, SUB_ENTEI_FRAME)&&
			 OPD_CheckScrollEnd(&dew->ScrlMng, SUB_RAIKOU_FRAME) ){	//炎雷はけたか？
			//ライコウＢＧ消す
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
			//ウィンドウ設定（画面中央にレクト）
			{
				WND_PARAM param = {
					S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,255-S3_ENSUIRAI_WIN_L,192-S3_RIVAL_WIN_U,
					S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,255-S3_ENSUIRAI_WIN_L,192-S3_RIVAL_WIN_U,
					GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
						GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
					GX_WND_PLANEMASK_OBJ,
					1,1
				};
				OPD_ReqWindowMove(&dew->WndCnt, 0, FALSE, &param);//即反映
			}

			//ロケット団スクリーン転送
			GF_BGL_ScreenBufSet(bgl, SUB_R1_FRAME,
								scene->RocketScrnData[0]->rawData,
								scene->RocketScrnData[0]->szByte );
			GF_BGL_ScreenBufSet(bgl, SUB_R2_FRAME,
								scene->RocketScrnData[1]->rawData,
								scene->RocketScrnData[1]->szByte );
			GF_BGL_ScreenBufSet(bgl, SUB_RMARK_FRAME,
								scene->RocketScrnData[2]->rawData,
								scene->RocketScrnData[2]->szByte );
			GF_BGL_LoadScreenV_Req(bgl, SUB_R1_FRAME);
			GF_BGL_LoadScreenV_Req(bgl, SUB_R2_FRAME);
			GF_BGL_LoadScreenV_Req(bgl, SUB_RMARK_FRAME);

			//スクロールオフセット戻す
			GF_BGL_ScrollSet( bgl, SUB_R1_FRAME, GF_BGL_SCROLL_X_SET, 0 );
			GF_BGL_ScrollSet( bgl, SUB_R1_FRAME, GF_BGL_SCROLL_Y_SET, 0 );
			GF_BGL_ScrollSet( bgl, SUB_R2_FRAME, GF_BGL_SCROLL_X_SET, 0 );
			GF_BGL_ScrollSet( bgl, SUB_R2_FRAME, GF_BGL_SCROLL_Y_SET, 0 );
			GF_BGL_ScrollSet( bgl, SUB_RMARK_FRAME, GF_BGL_SCROLL_X_SET, 0 );
			GF_BGL_ScrollSet( bgl, SUB_RMARK_FRAME, GF_BGL_SCROLL_Y_SET, 0 );

			//ロケット団ＢＧ表示
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_ON );
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_ON );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_SUIKUN_SLIDE_OUT:
		if (count >= S3_CONT_ANN3){
			//アンノーン
			OPD_StartDispAct(scene->Ann[2], 1);
		}
		//スイクンはける
		if ( count >= S3_CONT_SUIKUN_SLIDE_OUT ){
			WND_PARAM param = {
				S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,255-S3_ENSUIRAI_WIN_L,192-S3_RIVAL_WIN_U,
				S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,S3_ENSUIRAI_WIN_L,192-S3_RIVAL_WIN_U,
				GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
					GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_OBJ,
				1,1
			};
			OPD_ReqWindowMove(&dew->WndCnt, S3_SUIKUN_SLIDE_OUT_SYNC, FALSE, &param);

			//ウィンドウ1に特殊設定
			G2S_SetWnd1Position( S3_ENSUIRAI_WIN_L, S3_RIVAL_WIN_U, 255-S3_ENSUIRAI_WIN_L, 192-S3_RIVAL_WIN_U );
			G2S_SetWnd1InsidePlane( GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
					GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ, 1 );	//スイクンＢＧ抜き

			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_SUIKUN_FRAME,
							(256-(S3_ENSUIRAI_WIN_L*2)), 0,	S3_SUIKUN_SLIDE_OUT_SYNC );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_SUIKUN_SLIDE_OUT_WAIT:
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, SUB_SUIKUN_FRAME) ){	//スイクンはけたか？
			//スイクンＢＧ消す
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG0, VISIBLE_OFF );
			//ウィンドウスクロール
			{
				WND_PARAM param = {
					S3_ENSUIRAI_WIN_L,S3_RIVAL_WIN_U,255-S3_ENSUIRAI_WIN_L,192-S3_RIVAL_WIN_U,
					0,0,255,192,
					GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|
					GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
					GX_WND_PLANEMASK_OBJ,
					1,1
				};
				OPD_ReqWindowMove(&dew->WndCnt, S3_ROCKET_MASK_MAKE_SYNC, FALSE, &param);
			}

			//ロケット団スクリーンスクロール
			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_R1_FRAME,
						0, -S3_ROCKET1_SCROLL_VAL,	S3_ROCKET_SCROLL_SYNC );
			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_R2_FRAME,
						0, -S3_ROCKET2_SCROLL_VAL,	S3_ROCKET_SCROLL_SYNC );
			OPD_ReqScroll(	bgl, &dew->ScrlMng, SUB_RMARK_FRAME,
						0, -S3_ROCKET_MARK_SCROLL_VAL,	S3_ROCKET_SCROLL_SYNC );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_ROCKET_SCROLL_WAIT:		//スクロール待ち
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, SUB_R1_FRAME) ){
			//ウィンドウスクロール（閉じる）
			return TRUE;
		}
		break;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * シーン終了
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene3_End(OPD_WK_PTR wk, SCENE3_WORK *scene)
{
	u8 i,j;
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);
	sys_VBlankFuncChange( NULL, NULL );	// VBlankセット

	if (scene->InitOK){
		//3Dデータ解放
		{
			//カメラ削除
			GFC_PurgeCamera();
			GFC_FreeCamera(scene->Data.CameraPtr);
			//モデリングデータ削除
			for (i=0;i<MAP_BLOCK_MAX;i++){
				for(j=0;j<ANIME_TYPE_NUM;j++){
					NNS_G3dFreeAnmObj(	&scene->Data.Allocator, scene->Data.Block[i].AnmObj[j]);
					sys_FreeMemoryEz(scene->Data.Block[i].AnmMem[j]);
				}
				sys_FreeMemoryEz(scene->Data.Block[i].ResFile);
			}

			GF_G3D_Exit( scene->Data.g3Dman );
		}
		//スクリーンデータ解放
		for (i=0;i<RIVAL_MASK_NUM;i++){
			sys_FreeMemoryEz(scene->BgArc[i]);
		}
		for (i=0;i<ROCKET_BG_NUM;i++){
			sys_FreeMemoryEz(scene->RocketBgArc[i]);
		}
		sys_FreeMemoryEz(scene->SuikunBgArc);
		//アクター解放
		EndAct(wk, scene);
		//bgl解放
		GF_BGL_BGControlExit( bgl, GF_BGL_FRAME0_S );
		GF_BGL_BGControlExit( bgl, GF_BGL_FRAME1_S );
		GF_BGL_BGControlExit( bgl, GF_BGL_FRAME2_S );
		GF_BGL_BGControlExit( bgl, GF_BGL_FRAME3_S );

		scene->InitOK = 0;
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BGセット
 *
 * @param	wk		OBJワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene3BgSet(OPD_WK_PTR wk)
{
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);

	{	// BGシステム設定
		GF_BGL_SYS_HEADER BGsys_data = {
			GX_DISPMODE_GRAPHICS,GX_BGMODE_0,GX_BGMODE_0,GX_BG0_AS_3D
		};
		GF_BGL_InitBG( &BGsys_data );
	}

	//--サブ--		下画面
	{	// ライバルマスク、スイクン ＢＧ設定(サブ0)
		GF_BGL_BGCNT_HEADER SBG0_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000,		//キャラベースはマスクレイヤと同じ
			GX_BG_EXTPLTT_01, 0, 0, 0, FALSE			//プライオリティ0
		};
		GF_BGL_BGControlSet( bgl, SUB_MASK_FRAME, &SBG0_Data, GF_BGL_MODE_TEXT );
	}
	{	// エンテイ ＢＧ設定(サブ1)
		GF_BGL_BGCNT_HEADER SBG1_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0800, GX_BG_CHARBASE_0x04000,		//キャラベースはマスクレイヤと同じ
			GX_BG_EXTPLTT_01, 1, 0, 0, FALSE			//プライオリティ1
		};
		GF_BGL_BGControlSet( bgl, SUB_ENTEI_FRAME, &SBG1_Data, GF_BGL_MODE_TEXT );
	}
	{	// ライコウ ＢＧ設定(サブ2)
		GF_BGL_BGCNT_HEADER SBG2_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x1000, GX_BG_CHARBASE_0x04000,		//キャラベースはマスクレイヤと同じ
			GX_BG_EXTPLTT_01, 2, 0, 0, FALSE			//プライオリティ0
		};
		GF_BGL_BGControlSet( bgl, SUB_RAIKOU_FRAME, &SBG2_Data, GF_BGL_MODE_TEXT );
	}
	{	// ライバル ＢＧ設定(サブ3)
		GF_BGL_BGCNT_HEADER SBG3_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x1800, GX_BG_CHARBASE_0x04000,		//キャラベースはライバルレイヤと同じ
			GX_BG_EXTPLTT_01, 3, 0, 0, FALSE			//プライオリティ3
		};
		GF_BGL_BGControlSet( bgl, SUB_RIVAL_FRAME, &SBG3_Data, GF_BGL_MODE_TEXT );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BGロード
 *
 * @param	bgl		BGL
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene3GraLoad(GF_BGL_INI *bgl, SCENE3_WORK *scene)
{
	u8 i;
	const int rival_scr_tbl[RIVAL_MASK_NUM] = {
		NARC_op_demo_demo_rival1_u_lz_cscr,
		NARC_op_demo_demo_rival2_u_lz_cscr,
		NARC_op_demo_demo_rival3_u_lz_cscr,
		NARC_op_demo_demo_rival4_u_lz_cscr,
	};
	const int rocket_scr_tbl[ROCKET_BG_NUM] = {
		NARC_op_demo_demo_rdan1_u_lz_cscr,
		NARC_op_demo_demo_rdan2_u_lz_cscr,
		NARC_op_demo_demo_rdan3_u_lz_cscr,
	};

	//キャラ		ライバル+炎水雷
	ArcUtil_BgCharSet(ARC_OP_DEMO, NARC_op_demo_demo_rival_u_lz_ccgr,
						bgl, SUB_MASK_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	//スクリーン
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_rival5_u_lz_cscr,
						bgl, SUB_RIVAL_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);	//ライバル

	for (i=0;i<RIVAL_MASK_NUM;i++){
		scene->BgArc[i] = ArcUtil_ScrnDataGet(ARC_OP_DEMO, rival_scr_tbl[i], TRUE, &scene->ScrnData[i], HEAPID_OP_DEMO);
	}
	for (i=0;i<ROCKET_BG_NUM;i++){
		scene->RocketBgArc[i] = ArcUtil_ScrnDataGet(	ARC_OP_DEMO, rocket_scr_tbl[i],
														TRUE, &scene->RocketScrnData[i], HEAPID_OP_DEMO);
	}
	scene->SuikunBgArc = ArcUtil_ScrnDataGet(ARC_OP_DEMO, NARC_op_demo_demo_ensuirai1_u_lz_cscr,
												TRUE, &scene->SuikunScrnData, HEAPID_OP_DEMO);

	GF_BGL_LoadScreen( bgl, SUB_MASK_FRAME, scene->ScrnData[0]->rawData, scene->ScrnData[0]->szByte, 0 );

	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_ensuirai2_u_lz_cscr,
						bgl, SUB_ENTEI_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);	//エンテイ
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_ensuirai3_u_lz_cscr,
						bgl, SUB_RAIKOU_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);	//ライコウ

	//パレット
	ArcUtil_PalSet( ARC_OP_DEMO, NARC_op_demo_demo_bg_u_nclr,
						PALTYPE_SUB_BG, 0, PAL_ONE_SIZE*16*16, HEAPID_OP_DEMO );		//メイン　0番に16色16本ロード

	//--初期ＢＧ設定
	//BG0・上下画面ゲーフリロゴ非表示
///	GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
///	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
	//ベース背景とコピーライトをブレンド
///	G2_SetBlendAlpha( BLD_MASK_COPY_LIGHT, BLD_MASK_BACK_BASE_M, 0, 16);

	OS_WaitIrq(TRUE, OS_IE_V_BLANK); 	// Ｖブランク待ち
	//マスター輝度を戻す
///	WIPE_ResetBrightness( WIPE_DISP_MAIN );
///	WIPE_ResetBrightness( WIPE_DISP_SUB );

	GF_Disp_DispOn();
}

/////////////////////////////////////
//セルアクター

//--------------------------------------------------------------------------------------------
/**
 * セルアクター初期化
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void InitAct(OPD_WK_PTR wk, SCENE3_WORK *scene)
{
	u8 i;
	const int heapid = HEAPID_OP_DEMO;
	CLACT_U_RES_MANAGER_PTR *res_man;
	//リソースマネージャー初期化
	OPD_InitResMan(wk, ResEntryNumTbl);

	res_man = OPD_GetResManPtr(wk);

	//--ライバルシーン--
	//--chara読み込み
	scene->ResObjTbl[0][CLACT_U_CHAR_RES] = CLACT_U_ResManagerResAddArcChar(
			 							res_man[CLACT_U_CHAR_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_rival_u_lz_ccgr,
										TRUE, ACT_ID_S3_RIVAL, NNS_G2D_VRAM_TYPE_2DSUB, heapid);
	//--pal読み込み
	scene->ResObjTbl[0][CLACT_U_PLTT_RES] = CLACT_U_ResManagerResAddArcPltt(
										res_man[CLACT_U_PLTT_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_rival_u_nclr,
										FALSE, ACT_ID_S3_RIVAL, NNS_G2D_VRAM_TYPE_2DSUB,
										S3_ACT_RIVAL_PALETTE_NUM, heapid);
	//--cell読み込み
	scene->ResObjTbl[0][CLACT_U_CELL_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELL_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_rival_u_lz_ccer,
										TRUE, ACT_ID_S3_RIVAL, CLACT_U_CELL_RES, heapid);
	//--同じ関数でanim読み込み
	scene->ResObjTbl[0][CLACT_U_CELLANM_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELLANM_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_rival_u_lz_canr,
										TRUE, ACT_ID_S3_RIVAL, CLACT_U_CELLANM_RES, heapid);

	//--伝説ポケ3匹シーン--
	//--chara読み込み
	scene->ResObjTbl[1][CLACT_U_CHAR_RES] = CLACT_U_ResManagerResAddArcChar(
			 							res_man[CLACT_U_CHAR_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_ensuirai_d_lz_ccgr,
										TRUE, ACT_ID_S3_MINA_ANN, NNS_G2D_VRAM_TYPE_2DSUB, heapid);
	//--pal読み込み
	scene->ResObjTbl[1][CLACT_U_PLTT_RES] = CLACT_U_ResManagerResAddArcPltt(
										res_man[CLACT_U_PLTT_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_ensuirai_d_nclr,
										FALSE, ACT_ID_S3_MINA_ANN, NNS_G2D_VRAM_TYPE_2DSUB,
										S3_ACT_MINA_ANN_PALETTE_NUM, heapid);
	//--cell読み込み
	scene->ResObjTbl[1][CLACT_U_CELL_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELL_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_ensuirai_d_lz_ccer,
										TRUE, ACT_ID_S3_MINA_ANN, CLACT_U_CELL_RES, heapid);
	//--同じ関数でanim読み込み
	scene->ResObjTbl[1][CLACT_U_CELLANM_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELLANM_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_ensuirai_d_lz_canr,
										TRUE, ACT_ID_S3_MINA_ANN, CLACT_U_CELLANM_RES, heapid);
	// リソースマネージャーから転送
	for (i=0;i<2;i++){
		// Chara転送
		CLACT_U_CharManagerSet( scene->ResObjTbl[i][CLACT_U_CHAR_RES] );
		// パレット転送
		CLACT_U_PlttManagerSet( scene->ResObjTbl[i][CLACT_U_PLTT_RES] );
	}

	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );		// SUB DISP OBJ ON
}

//--------------------------------------------------------------------------------------------
/**
 * セルアクター終了
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void EndAct(OPD_WK_PTR wk, SCENE3_WORK *scene)
{
	u8 i;
	//アクター削除
	CLACT_Delete(scene->Rival);
	CLACT_Delete(scene->Minaki);
	CLACT_Delete(scene->Ann[0]);
	CLACT_Delete(scene->Ann[1]);
	CLACT_Delete(scene->Ann[2]);
	for (i=0;i<2;i++){
		// キャラ転送マネージャー破棄
		CLACT_U_CharManagerDelete(scene->ResObjTbl[i][CLACT_U_CHAR_RES]);
		// パレット転送マネージャー破棄
		CLACT_U_PlttManagerDelete(scene->ResObjTbl[i][CLACT_U_PLTT_RES]);
	}
	// キャラ・パレット・セル・セルアニメのリソースマネージャー破棄
	OPD_DelResMan(wk);
}

//--------------------------------------------------------------------------------------------
/**
 * セルアクターをセット
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//-------------------------------------------------------------------------------------------
static void SetActor( OPD_WK_PTR wk, SCENE3_WORK *scene )
{
	int i;
	CLACT_HEADER			cl_act_header;
	CLACT_ADD add;

	const int ann_y[3] = {ANN1_DEF_POS_Y, ANN2_DEF_POS_Y, ANN3_DEF_POS_Y};
	const int ann_anm[3] = {ANM_NO_ANN1, ANM_NO_ANN2, ANM_NO_ANN3};

	//ライバル
	OPD_MakeClActHeader( ACT_ID_S3_RIVAL, wk, 0, NNS_G2D_VRAM_TYPE_2DSUB, &add, &cl_act_header );
	add.mat.x = FX32_ONE * RIVAL_DEF_POS_X;
	add.mat.y = FX32_ONE * RIVAL_DEF_POS_Y;
	scene->Rival = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Rival,0);
	CLACT_SetDrawFlag(scene->Rival, 0);	//非表示
	CLACT_AnmChg( scene->Rival, ANM_NO_RIVAL );

	//ミナキ
	OPD_MakeClActHeader( ACT_ID_S3_MINA_ANN, wk, 0, NNS_G2D_VRAM_TYPE_2DSUB, &add, &cl_act_header );
	add.mat.x = FX32_ONE * MINAKI_DEF_POS_X;
	add.mat.y = FX32_ONE * MINAKI_DEF_POS_Y;
	scene->Minaki = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Minaki,0);
	CLACT_SetDrawFlag(scene->Minaki, 0);	//非表示
	CLACT_AnmChg( scene->Minaki, ANM_NO_MINAKI );

	//アンノーン
	for(i=0;i<3;i++){
		OPD_MakeClActHeader( ACT_ID_S3_MINA_ANN, wk, 0, NNS_G2D_VRAM_TYPE_2DSUB, &add, &cl_act_header );
		add.mat.x = FX32_ONE * ANN_DEF_POS_X;
		add.mat.y = FX32_ONE * ann_y[i];
		scene->Ann[i] = CLACT_Add(&add);
		CLACT_SetAnmFlag(scene->Ann[i],0);
		CLACT_SetDrawFlag(scene->Ann[i], 0);	//非表示
		CLACT_AnmChg( scene->Ann[i], ann_anm[i] );
	}

}

//--------------------------------------------------------------------------------------------
/**
 * 3Dロード
 *
 * @param	scene_wk	シーンワーク
 *
 * @return	none
 */
//-------------------------------------------------------------------------------------------
static void Load3D(SCENE3_WORK *scene_wk)
{
	u8 i,j;
	ARCHANDLE* handle;
	NNSG3dResMdl *model;
	NNSG3dResTex *texture;
	void *pAnmRes;

	//アーカイブハンドルオープン
	handle = ArchiveDataHandleOpen( ARC_OP_DEMO, HEAPID_OP_DEMO );
	//アニメアロケータ
	sys_InitAllocator(&scene_wk->Data.Allocator,HEAPID_OP_DEMO, 4);

	for (i=0;i<MAP_BLOCK_MAX;i++){
		//モデリングデータをロード
		scene_wk->Data.Block[i].ResFile = ArchiveDataLoadAllocByHandle( handle, ModelArcTbl[i], HEAPID_OP_DEMO );
		simple_3DModelSetResFileAlready( &scene_wk->Data.Block[i].RenderObj, &model,
										 &scene_wk->Data.Block[i].ResFile );
		texture = NNS_G3dGetTex(scene_wk->Data.Block[i].ResFile);	// テクスチャリソース取得
/**
		model_set = NNS_G3dGetMdlSet(scene_wk->Data.Block[i].ResFile);

		GF_ASSERT(model_set->dict.numEntry==1&&"モデルセットの中に複数モデルが存在");
*/

		//モデリングデータはグローバルステートを使用する
		NNS_G3dMdlUseGlbDiff(model);			// ディフューズ
		NNS_G3dMdlUseGlbAmb(model);				// アンビエント
		NNS_G3dMdlUseGlbSpec(model);			// スペキュラー
		NNS_G3dMdlUseGlbEmi(model);				// エミッション

		NNS_G3dMdlUseGlbLightEnableFlag(model);

		for(j=0;j<ANIME_TYPE_NUM;j++){
			//アニメーションをロード
			scene_wk->Data.Block[i].AnmMem[j] = ArchiveDataLoadAllocByHandle( handle, AnmArcTbl[i][j], HEAPID_OP_DEMO );
			pAnmRes = NNS_G3dGetAnmByIdx(scene_wk->Data.Block[i].AnmMem[j], 0);
			// 必要量のメモリをアロケートする。
			scene_wk->Data.Block[i].AnmObj[j] = NNS_G3dAllocAnmObj( &scene_wk->Data.Allocator, // 使用するアロケータを指定
					                   		       pAnmRes,    // アニメーションリソースを指定
							                       model);    // モデルリソースを指定
			//イニシャライズ
			NNS_G3dAnmObjInit(scene_wk->Data.Block[i].AnmObj[j], // アニメーションオブジェクトへのポインタ
			                  pAnmRes, 			// アニメリソースへのポインタ
				              model,  	// NNSG3dResMdlへのポインタ
					          texture );  		// NNSG3dResTexへのポインタ
			//アニメバインド
			NNS_G3dRenderObjAddAnmObj( &scene_wk->Data.Block[i].RenderObj, scene_wk->Data.Block[i].AnmObj[j] );
		}
	}
	//ハンドルクローズ
	ArchiveDataHandleClose( handle );

	scene_wk->Data.CameraPtr = GFC_AllocCamera(HEAPID_OP_DEMO);	//カメラ作成
	{
		VecFx32 target = {0,0,FX32_ONE*16*6};
		//カメラセット
		GFC_InitCameraTDA( &target,
			CameraData.Distance,	// 距離
			&CameraData.Angle,	//
			CameraData.PerspWay,	// 投射影の角度
			CameraData.View,
			FALSE,				//バインドしない
			scene_wk->Data.CameraPtr
			);
		GFC_SetCameraPerspWay(0x0981,scene_wk->Data.CameraPtr);
		GFC_AttachCamera(scene_wk->Data.CameraPtr);
	}

	// ポリゴンアトリビュート
	NNS_G3dGlbPolygonAttr(
				5,		//<ライト1,4以外有効（0101）
				GX_POLYGONMODE_MODULATE,
				GX_CULL_BACK,
				0,
				31,
				GX_POLYGON_ATTR_MISC_FOG);
}

//--------------------------------------------------------------------------------------------
/**
 * 3D表示
 *
 * @param	scene_wk	シーンワーク
 *
 * @return	none
 */
//-------------------------------------------------------------------------------------------
static void Disp3D(SCENE3_WORK *scene_wk)
{
	u8 i;
	u8 no;
	MtxFx33 rotate_tmp = {FX32_ONE,0,0,0,FX32_ONE,0,0,0,FX32_ONE};
	VecFx32 scale = {FX32_ONE,FX32_ONE,FX32_ONE};
	VecFx32 trans = {0,0,0};

	if (scene_wk->Disp3DNo == 0xffff){
		return;
	}

	no = scene_wk->Disp3DNo;

	GF_G3X_Reset();
	GFC_CameraLookAt();

	//アニメ再生
	for (i=0;i<ANIME_TYPE_NUM;i++){
		if (scene_wk->Data.Block[no].AnmObj[i]->frame+FX32_ONE <
				NNS_G3dAnmObjGetNumFrame(scene_wk->Data.Block[no].AnmObj[i])){
			//アニメフレーム更新
			scene_wk->Data.Block[no].AnmObj[i]->frame += (FX32_ONE);
		}
	}

	simple_3DModelDraw(	&scene_wk->Data.Block[no].RenderObj,
						&trans,
						&rotate_tmp,
						&scale);

	GF_G3_RequestSwapBuffers(GX_SORTMODE_AUTO,GX_BUFFERMODE_W);
}

//--------------------------------------------------------------------------------------------
/**
 * 3Dセットアップ
 *
 * @param	none
 *
 * @return	none
 */
//-------------------------------------------------------------------------------------------
static void SetUp3D(void)
{
	// ３Ｄ使用面の設定(表示＆プライオリティー)
    G2_SetBG0Priority(0);

	// 各種描画モードの設定(シェード＆アンチエイリアス＆半透明)
    G3X_SetShading( GX_SHADING_TOON );
    G3X_AntiAlias( TRUE );
	G3X_AlphaTest( FALSE, 0 );	// アルファテスト　　オフ
	G3X_AlphaBlend( TRUE );		// アルファブレンド　オン
	G3X_EdgeMarking( TRUE );
	G3X_SetEdgeColorTable(gEdgeColor);
	G3X_SetFog( FALSE, GX_FOGBLEND_COLOR_ALPHA, GX_FOGSLOPE_0x8000, 0 );

	// クリアカラーの設定
    G3X_SetClearColor(GX_RGB(0,0,0),0,0x7fff,63,FALSE);	//color,alpha,depth,polygonID,fog

	// ビューポートの設定
    G3_ViewPort(0, 0, 255, 191);
}

//--------------------------------------------------------------------------------------------
/**
 * ライトのセットアップ
 *
 * @param	inNo		ライトナンバー
 *
 * @return	none
 */
//-------------------------------------------------------------------------------------------
static void SetUpLight(const u8 inNo)
{
	u8 i;
	for(i=0;i<4;i++){
		//ライトセット
		NNS_G3dGlbLightVector(i,
							LightVec[inNo][i].x,
							LightVec[inNo][i].y,
							LightVec[inNo][i].z);
		NNS_G3dGlbLightColor(i, LightColor[inNo][i]);
	}

	//グローバルステート書き換え
	NNS_G3dGlbMaterialColorDiffAmb(
				Diff[inNo],
				Amb[inNo],
				FALSE);

	NNS_G3dGlbMaterialColorSpecEmi(
				Spec[inNo],
				Emi[inNo],
				FALSE);
}